package com.example.mobilesafe.activity;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.example.mobilesafe.R;
import com.example.mobilesafe.dao.BlackNumberDao;
import com.example.mobilesafe.domain.BlackNumberInfo;
import com.example.mobilesafe.utils.ToastUtil;

import java.util.List;

public class BlackNumberActivity extends AppCompatActivity {

    private Button btn_add;

    private ListView lv_blacknumber;

    private BlackNumberDao mDao;

    private List<BlackNumberInfo> mBlackNumberList;

    private BlackNumberAdapter mAdapter;

    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            // 4.告知ListView可以去设置数据适配器了
            if (mAdapter == null){
                // 这里做一个非空判断，如果为空才创建，避免重复创建
                mAdapter = new BlackNumberAdapter();
                // 5.配置适配器
                lv_blacknumber.setAdapter(mAdapter);
            }else {
                mAdapter.notifyDataSetChanged();
            }
        }
    };

    // 默认的拦截类型
    private int mMode = 1;

    // 判断是否加载的标志位
    private boolean mIsLoad = false;

    // 数据表中数据的总条数
    private int mCount;


    private class BlackNumberAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return mBlackNumberList.size();
        }

        @Override
        public Object getItem(int position) {
            return mBlackNumberList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            // 创建ViewHolder内部类
            ViewHolder holder = null;

            // (1).复用convertView
            if (convertView == null){
                // 创建View
                convertView = View.inflate(getApplicationContext(), R.layout.listview_blacknumber_item, null);
                // （2）.使用ViewHolder减少findViewById次数
                holder = new ViewHolder();
                holder.tv_phone = convertView.findViewById(R.id.tv_phone);
                holder.tv_mode = convertView.findViewById(R.id.tv_mode);
                holder.iv_delete = convertView.findViewById(R.id.iv_delete);
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder) convertView.getTag();
            }

            // "删除"按钮的点击事件
            holder.iv_delete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 1.数据库中的删除
                    mDao.delete(mBlackNumberList.get(position).getPhone());
                    // 2.集合中的删除
                    mBlackNumberList.remove(position);
                    // 3.通知适配器更新
                    if (mAdapter != null){
                        mAdapter.notifyDataSetChanged();
                    }
                }
            });

            holder.tv_phone.setText(mBlackNumberList.get(position).getPhone());
            // 将字符串转换成整型，便于switch-case判断
            int mode = Integer.parseInt(mBlackNumberList.get(position).getMode());
            switch (mode){
                case 1:holder.tv_mode.setText("拦截短信");
                    break;
                case 2:holder.tv_mode.setText("拦截电话");
                    break;
                case 3:holder.tv_mode.setText("拦截所有");
                    break;
            }
            return convertView;
        }
    }

    // (3) 将ViewHolder内部类定义成静态内部类
    private static class ViewHolder {
        // 有几个控件就有几个字段
        TextView tv_phone;
        TextView tv_mode;
        ImageView iv_delete;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_black_number);
        
        // 初始化UI
        initUI();
        
        // 初始化数据
        initData();
    }

    /**
     * 初始化UI
     */
    private void initUI() {
        btn_add = findViewById(R.id.btn_add);
        lv_blacknumber = findViewById(R.id.lv_blacknumber);
        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showAddDialog();
            }
        });

        // 监听其滚动状态
        lv_blacknumber.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // 容错处理
                if (mBlackNumberList != null){
                    // 滚动过程中，状态发生改变调用方法
                    if (scrollState == SCROLL_STATE_IDLE
                            && lv_blacknumber.getLastVisiblePosition() >= mBlackNumberList.size() - 1
                            && !mIsLoad){
                        /*
                         * SCROLL_STATE_IDLE：空闲状态 & getLastVisiblePosition()：列表已经滑动到底部 & mIsLoad：加载标志符
                         * mIsLoad用于防止数据重复加载。如果当前正在加载mIsLoad变为true，本次加载完毕后变成false
                         * 如果下一次加载需要执行时，会使用mIsLoad进行判断，如果为true，则需要等待上一次加载完成，将其值改为false后才能加载
                         */

                        // 条目的总数 > 集合的大小，说明还有数据，才会加载下一页数据
                        if (mCount > mBlackNumberList.size()){
                            // 加载下一页数据
                            new Thread(){
                                @Override
                                public void run() {
                                    // 1.获取操作黑名单数据库的对象
                                    mDao = BlackNumberDao.getInstance(getApplicationContext());
                                    // 2.查询分页数据
                                    List<BlackNumberInfo> moreData = mDao.queryLimit(mBlackNumberList.size(), 10);
                                    // 3.添加下一页数据（两个集合合并）
                                    mBlackNumberList.addAll(moreData);
                                    // 4.通过消息机制告知主线程可以去使用包含数据的集合，发送空消息告知线程即可
                                    mHandler.sendEmptyMessage(0);
                                }
                            }.start();
                        }
                    }
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                // 滚动过程中调用方法
            }
        });
    }

    /**
     * 初始化数据
     */
    private void initData() {
        // 获取数据库中的所有电话号码
        new Thread(){
            @Override
            public void run() {
                // 1.获取操作黑名单数据库的对象
                mDao = BlackNumberDao.getInstance(getApplicationContext());
                // 2.查询所有数据
                mBlackNumberList = mDao.queryLimit(0,10);
                mCount = mDao.getCount();
                // 3.通过消息机制告知主线程可以去使用包含数据的集合，发送空消息告知线程即可
                mHandler.sendEmptyMessage(0);
            }
        }.start();
    }

    /**
     * “添加黑名单号码”的Dialog界面
     */
    private void showAddDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        final AlertDialog dialog = builder.create();
        View view = View.inflate(getApplicationContext(), R.layout.dialog_add_blacknumber, null);
        dialog.setView(view,0,0,0,0);

        final EditText et_phone = view.findViewById(R.id.et_phone);
        RadioGroup rg_group = view.findViewById(R.id.rg_group);
        Button btn_submit = view.findViewById(R.id.btn_submit);
        Button btn_cancel = view.findViewById(R.id.btn_cancel);

        // 监听其选中条目的切换过程
        rg_group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId){
                    case R.id.rb_sms:
                        // 拦截短信
                        mMode = 1;
                        break;
                    case R.id.rb_phone:
                        // 拦截电话
                        mMode = 2;
                        break;
                    case R.id.rb_all:
                        // 拦截所有
                        mMode = 3;
                        break;

                }
            }
        });

        // “提交”按钮的点击事件
        btn_submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 1.获取输入框中的电话号码
                String phone = et_phone.getText().toString();
                if (!TextUtils.isEmpty(phone)){
                    // 2.数据库插入——当前输入的拦截电话号码
                    mDao.insert(phone,mMode + "");
                    // 3.让数据库和集合保持同步（1.数据库中的数据重新读一遍；2.手动向集合中添加对象(插入数据构建的对象)）
                    BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
                    blackNumberInfo.setPhone(phone);
                    blackNumberInfo.setMode(mMode + "");
                    // 4.将对象插入到集合的顶部
                    mBlackNumberList.add(0,blackNumberInfo);
                    // 5.通知数据适配器刷新（数据适配器中的集合发生改变）
                    if(mAdapter != null){
                        mAdapter.notifyDataSetChanged();
                    }
                    // 6.关闭对话框
                    dialog.dismiss();
                }else {
                    ToastUtil.show(getApplicationContext(),"请输入拦截号码");
                }
            }
        });

        // "取消"按钮的点击事件
        btn_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 关闭对话框
                dialog.dismiss();
            }
        });
        dialog.show();
    }
}